package com.moons.uvcdemo;

import android.util.Log;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

public class MYFileUtils {
	public final static String TAG = "MYFileUtils";


	public static boolean makeFile(final InputStream is, final String filepath) {
		if (null == is || null == filepath) {
			Log.e(TAG, String.format("make file[%s] failed!!!", filepath));
			return false;
		}

		OutputStream os = null;
		try {
			os = new FileOutputStream(filepath);
			int count = 0;
			byte[] buf = new byte[16384]; // 1024 * 16 = 16384
			while ((count = is.read(buf)) > 0) {
				os.write(buf, 0, count);
				os.flush();
			}
		} catch (IOException ie) {
			ie.printStackTrace();
			return false;
		} finally {
			try {
				if (null != os) {
					os.close();
					os = null;
				}
			} catch (Exception e) {
				e.printStackTrace();
				return false;
			}
		}
		return true;
	}

	// 复制文件
	// srcFile: 源文件的全路径名称
	// destFile: 目的文件的全路径名称
	public static boolean copy(final String srcFile, final String destFile) {
		Log.d(TAG,"copy " + srcFile + " ----> " + destFile);
		if (null == srcFile || null == destFile) {
			Log.e(TAG, "copy file paths has null, copy { " + srcFile + " ----> " + destFile + " }");
			return false;
		}

		FileChannel inputChannel = null;
		FileChannel outputChannel = null;

		FileInputStream is = null;
		FileOutputStream os = null;
		try {
			File source = new File(srcFile);
			File dest = new File(destFile);
			is = new FileInputStream(source);
			os = new FileOutputStream(dest);
			inputChannel = is.getChannel();
			outputChannel = os.getChannel();
			outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
		} catch (IOException ie) {
			ie.printStackTrace();
			return false;
		} finally {
			try {
				if (null != inputChannel) inputChannel.close();
				if (null != outputChannel) outputChannel.close();
				inputChannel = null; outputChannel = null;

				if (null != os) os.close();
				if (null != is) is.close();
				is = null; os = null;
			} catch (IOException iex) {
				iex.printStackTrace();
				return false;
			}
		}
		return true;
	}

	// 搜索文件，并返回文件的全路径
	public static String searchFile(final String dir, final String keyfile) {
//		Log.d(TAG,"dir: " + dir + ", keyfile: " + keyfile);
		// File f = new File("/")指在当前盘符路径下
		// listFiles()可以把目录下面的文件和子目录都列举出来
		File[] files = new File(dir).listFiles();
		if (null != files) {
			for (File f : files) {
				//			Log.d(TAG,"path: " + f.getAbsolutePath());
				// 判断文件名f是否包含keyfile
				if (f.getName().contains(keyfile)) {
					return f.getAbsolutePath();
				}

				// 如果是文件夹则进行递归查找
				if (f.isDirectory()) {
					final String found = searchFile(f.getAbsolutePath(), keyfile);
					if (found != null) {
						return found;
					}
				}
			}
		}
		return null;
	}

	// 获取目录dir下的文件列表，返回该目录下的文件列表(文件名称列表,不是全路径名)
	public static List<String> getFileList(final String dir) {
		final List<String> filelist = new ArrayList<String>();
		// File f = new File("/")指在当前盘符路径下
		// listFiles()可以把目录下面的文件和子目录都列举出来
		File[] files = new File(dir).listFiles();
		if (null != files) {
			for (File f : files) {
				if (! f.getName().isEmpty()) {
					filelist.add(f.getName());
				}
			}
		}
		return filelist;
	}

	// 获取目录dir下的文件列表，返回该目录下的文件列表(文件全路径名列表)
	// dir 文件夹的全路径名称
	// deepth 获取文件列表深度, 当前待获取的文件的深度为0, 子目录的深度为1, 依此递推
	public static List<String> getFileList(final String dir, int deepth) {
		final List<String> filelist = new ArrayList<String>();
		final List<String> tmpList = new ArrayList<String>();
		deepth--;
		File[] files = new File(dir).listFiles();

		if (null != files) {
			for (File f : files) {
				if (! f.getName().isEmpty()) {
//					Log.e(TAG,"f.getName()=="+f.getName());
					// 文件或者目录名称到文件列表
					filelist.add(f.getAbsolutePath());

					// 获取子目录文件列表
					if (f.isDirectory() && deepth > -1) {
						tmpList.clear();
						tmpList.addAll(getFileList(f.getAbsolutePath(), deepth));
//	                    Log.d(TAG,"deepth: " + deepth + ", path: " + f.getAbsolutePath() + ", size: " + tmpList.size());
						filelist.addAll(tmpList);
					}
				}
			}
		}
		return filelist;
	}

	// 删除文件或者文件夹
	public static boolean deleteFile(final String path) {
		try {
			File delFile = new File(path);
			if (null == delFile || ! delFile.exists()) {
				Log.e(TAG, "file: " + path + " is not exists.");
				return false;
			}

			// 如果是文件夹则先删除文件夹下面的文件
			if (delFile.isDirectory()) {
				// File f = new File("/")指在当前盘符路径下
				// listFiles()可以把目录下面的文件和子目录都列举出来
				File[] files = delFile.listFiles();
				for (File f : files) {
					if (f.isDirectory()) {
						deleteFile(f.getAbsolutePath());
					} else {
						f.delete();
					}
				}
			}

			return delFile.delete();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

//	// 获取文件的读写权限
//	public static int getFileMode(String filePath) {
//
//		return  ;
//	}

	// 检测文件是否存在
	public static boolean isExists(File filePath) {
		Log.d(TAG,"============filepath="+filePath.exists());
		return filePath.exists();
	}

}